#ifndef	_J_DRETVE_H_
#define	_J_DRETVE_H_

//javno  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

#include "tipovi.h"
#include "postavke.h"

//predaja pri programskom prekidu
typedef struct _parametri_dretve_t_ {
	void (*poc_funkc)(void *);	//pocetna funckija dreve
	void *param;			//parametar za stog
	uint32 *stog;			//pocetni stog
	int prio;			//prioritet
	int rasp;			//koji rasporedjivac? FIFO, RR, ...
} parametri_dretve_t;

void j_visedretvenost_inicijaliziraj();

//osnovno s dretvama
int j_stvori_dretvu (void *param);
int j_dretva_odstupi(void *param);
int j_dretva_zavrsetak (void *param);
int j_id_dretve (void *param);
int j_dohvati_prioritet (void *param);
int j_postavi_prioritet (void *param);
int j_cekaj_kraj_dretve (void *param);

#define RASP_PRP	1	//FIFO
#define RASP_KRUZNO	2	//RR
#define RASP_DRUGO	4	//nekako drukcije

enum {
	AKTIVNA = 0,	//mora biti 0
	PRIPRAVNA = 1,	//mora biti 1

	/* dodaj ostala po potrebi */
	REDDRETVE,	//dretva ceka na zavrsetak druge dretve
	REDALARMA,	//dretva ceka na alarm
	REDUI,		//dretva ceka na dovrsetak UI operacije

	PASIVNA = NAJ_RED	//zavrsila je s radom
};

//javno  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

#if defined(_J_DRETVE_C_) || defined(_J_RED_C_)
//samo za dretve.c i "prijatelje"  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

typedef struct _opisnikdretve_t_ {
	uint32 *stog;		//"kontekst" je na stogu, trebam pokazivac stoga

	union {
		int id;		//id dretve
		int slobodno;	//-1 ako se ne koristi
	};

	int prio;		//prioritet
	int rasp;		//nacin rasporedjivanja

	struct _opisnikdretve_t_ *iduci; //pokazivac na iduci opisnik dretve u
				//redu u kom se i ova nalazi, NULL ako je zadnja

	int red;		//u kojem je stanju/redu, 0-Akt, 1-pripr
	
	int kraj;		//id reda dretvi koje cekaju kraj ove dretve
} opisnikdretve_t;

typedef struct _lista_dretvi_t_ {
	opisnikdretve_t *prvi;
	opisnikdretve_t *zadnji;
} lista_dretvi_t;

//"interne" funkcije
void j_samo_stavi_u_pripravne (opisnikdretve_t *opd);
void j_aktiviraj_prvu_pripravnu();
inline opisnikdretve_t *j_aktivna_dretva();

#endif	/* _J_DRETVE_C_ i ostale */
#endif	/* _J_DRETVE_H_ */